package com.zsr.rabbitmq.six;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.zsr.rabbitmq.utils.RabbitMqUtils;

import java.util.Scanner;

/**
 * 生产者 单播模式
 * 生产者处理exchange的创建,然后消费者创造他们所需要的队列并将其绑定到exchange。
 * 这种分离策略的优点是，当消费者需要新队列时,消费者只需要根据需要创建队列并绑定,
 * 不需要生产者需要了解他们。这不是完全解耦,消费者必须知道exchange的存在以绑定它。
 *
 * 另一方面,有一个非常确实的危险。
 * 如果在消费者部署之前,有任意消费者正在运行,那么exchange就无法绑定,
 * 这样生产者启动后发出的所有消息都将丢失。这需要系统实际情况来决定是否是可接受的。
 * @author zsr
 * @date 2021/8/7 20:10
 */
public class DirectLogs {
    public static final String EXCHANGE_NAME="direct_logs";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        //声明一个direct交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);

        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            String message = scanner.next();
            /**
             * 发布消息
             * 1.交换机的名字
             * 2.routingKey（两个消费者都接收到消息，和修改routingKey无关系）
             *      广播模式不管路由键，将消息派发给对应的绑定了交换器的所有消息队列。
             * 3.其他参数
             * 4.消息体
             */
            channel.basicPublish(EXCHANGE_NAME,"info",null,message.getBytes("UTF-8"));
            System.out.println("发送成功");
        }
    }
}
